// 定义类型格式为 let 变量名:变量类型;

// 声明一个变量a ，类型为number,在之后的使用， a只能为number

let a: number;
a = 10;

// 当a赋值为其他类型时会报错
// a = 'hi';

// 自动类型检测
// 即，但一个变量在最初声明时赋值，那么会对变量进行类型检测，最初的值所属类型则为该变量的类型
// 声明变量C，C的类型为string
let c = 'hi'
// 因此，在赋值boolean时会报错
// c = true

// 可以给方法的形参定义参数类型
// function 方法名():函数的返回值类型{}
function sum(one: number, two: number): number {
    return one + two
}
// 由于方法中形参规定了参数类型，所以当参数不为number时则会报错
// 接收的参数必须与函数返回值的类型相同
let sums: number = sum(123, 234);
// sum(123,"123");

// 使用字面量进行类型声明,在该类型中，则限制了f的值为10
let f: 10;
// 使用|来链接多个值（联合类型），限制变量在某些值之间
let sex: 'male' | 'female'

// any 任意类型
// 显式any
let d: any;
d = 10;
d = 'hi'

// 隐式any
let d1;
d1 = 10;
d1 = "hi";

// unknown未知类型
let e: unknown
e = 10
e = 'hi'

// any可以赋给其他类型的变量，会关闭其他变量的类型判断
// 但是unknown不能随意赋值给其他变量

// 类型断言,可以告知解析器e的类型就是string
let str: string;
// 语法1
str = e as string
// 语法2
str = <string>e

// void nerve 主要用于设置函数返回值
function fn(): void {
    // void表示函数没有返回值
    // 也可以return null 或者 undefined
    // return null
    return undefined
}

function fn5(): never {
    // nerve表示永远不会返回结果
    // 用于设置抛出异常
    throw new Error("报错！")
}

// object 对象，在js中一切皆是对象，所有一般是为了限制对象中的属性
// 在属性名后面加上一个问号，表示该属性为可选属性
let obj: { name: string, age?: number };
// 当没有设置限定的属性时，则会报错
// obj = {}
obj = { name: "小李" }

// [propName:string]:any 表示可以有任意属性
let obj1: { name: string, [propName: string]: unknown }
obj1 = { name: '小黄', a: 10, c: 'sh' }

// 函数
// 设置函数结果的类型声明
// 语法：(形参:类型,形参:类型...)=> 返回值
let fn2: (a: number, b: number) => number
fn2 = function (n1, n2): number {
    return n1 + n2
}

// array数组
// 表示number类型的数组 格式为 let 变量名:类型[] 或者 let 变量名:Array<类型>
let arr: number[]
arr = [1, 2, 3]

let arr1: Array<string>
arr1 = ['1', 'hs']

// 元组，固定长度的数组，如果长度过长，建议使用数组
let h: [string, string]
// 值与定义要一一对应
h = ["he", "hi"]

// enum 枚举
// 定义一个枚举类
// 枚举类，将可能的情况都列举出来进行使用
enum Sex {
    male = 0,
    female = 1
}
let en: { name: string, sex: Sex }

en = {
    name: '小李',
    sex: Sex.male
}

// console.log(en.sex === Sex.male)

// 类型别名,简化类型的使用
type myType = 1|2|3|4|5
let type1:myType
let type2:myType